﻿<p><code>/etc/passwd</code>档案的构造是这样的：每一行都代表一个账号，有几行就代表有几个账号在你的系统中。 不过需要
    特别留意的是，里头很多账号本来就是系统正常运作所必须要的，我们可以简称他为系统账号， 例如
    <code>bin, daemon, adm, nobody</code> 等等，档案内容如下：
    <pre><code>[root@centos-chuan ~]# cat /etc/passwd | head
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin</code></pre>
</p>
<p>从此档案的内容可以看到，每一行是一个账号，由七个字段组成，每个字段之间使用<code>:</code>分隔，各个字段的含义如下所述：</p>
<ol>
    <li><strong>用户名：</strong><br />
        第1个字段是用户名，（如第一行中的<code>root</code>就是用户名），代表用户账号的字符串。用户名字符可以是大小写字母、数字、减号（不能出现在首位）、点以及下划线，其他字符不合法。虽然用户名中可以出现点，
        但不建议使用，尤其是首位为点时，另外减号也不建议使用，因为容易造成混淆。
    </li>
    <li><strong>密码：</strong><br />
        第2个字段存放的就是该账号的口令，为什么是’x’呢？早期的unix系统口令确实是存放在这里，但基于安全因素，后来就将其存放到<code>/etc/shadow</code>中了，在这里只用一个’x’代替。
    </li>
    <li><strong>UID</strong><br />
        这个数字代表用户标识号，也叫做<code>uid</code>。系统识别用户身份就是通过这个数字来的，0就是<code>root</code>，也就是说你可以修改<code>test</code>用户的<code>uid</code>为0，那么系统会认为<code>root</code>和<code>test</code>为同一个账户。
        通常<code>uid</code>的取值范围是0~65535，0是超级用户（<code>root</code>）的标识号，1~499由系统保留，作为管理账号，普通用户的标识号从500开始，如果我们自定义建立一个普通用户，你会看到该账户的标识号是大于或等于500的。
        <div class="table-responsive">
            <table class="table table-condensed table-bordered">
                <thead>
                    <tr>
                        <th>UID范围</th>
                        <th>使用者特性</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>0(系统管理员)</td>
                        <td>
                            当 <code>UID</code> 是 0 时，代表这个账号是『系统管理员』！ 所以当你要让其他的账号
                            名称也具有 <code>root</code> 的权限时，将该账号的 <code>UID</code> 改为 0 即可。 不过，很不建议有多个账号的
                            <code>UID</code> 是 0
                        </td>
                    </tr>
                    <tr>
                        <td>
                            1~499<br />
                            (系统账号)
                        </td>
                        <td>
                            <p>
                                保留给系统使用的  <code>ID</code>，其实除了 0 之外，其他的 <code>UID</code> 权限与特性并没有不一
                                样。默认 500 以下的数字让给系统作为保留账号只是一个习惯。
                            </p>

                            <p>
                                由于系统上面启动的服务希望使用较小的权限去运行，因此不希望使用  <code>root</code>
                                的身份去执行这些服务， 所以我们就得要提供这些运作中程序的拥有者账号
                                才行。这些系统账号通常是不可登入的， 所以才会有
                                <code>/sbin/nologin</code> 这个特殊的 shell 存在。
                            </p>

                            <p>
                                根据系统账号的由来，通常系统账号又约略被区分为两种：
                                <ul>
                                    <li>1~99：由 <code>distributions</code> 自行建立的系统账号；</li>
                                    <li>100~499：若用户有系统账号需求时，可以使用的账号 <code>UID</code>。</li>
                                </ul>
                            </p>
                        </td>
                    </tr>
                    <tr>
                        <td>500~65535
                            (可登入账号)</td>
                        <td>给一般使用者用的，事实上目前的  <code>linux</code> 核心 (2.6.x 版)已经可以支持到
                            4294967295 (2^32-1) 这么大的 <code>UID</code> 号码了！
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </li>
    <li><strong>GID</strong><br />
        表示组标识号，也叫做<code>gid</code>。这个字段对应着<code>/etc/group</code> 中的一条记录，其实<code>/etc/group</code>和<code>/etc/passwd</code>基本上类似。
    </li>
    <li><strong>用户信息说明栏</strong><br />
        注释说明，该字段没有实际意义，通常记录该用户的一些属性，例如姓名、电话、地址等等。不过，当你使用<code>finger</code>的功能时就会显示这些信息的。
    </li>
    <li><strong>家目录</strong><br />
        当用户登录时就处在这个目录下。root的家目录是<code>/root</code>，普通用户的家目录则为<code>/home/username</code>，这个字段是可以自定义的，
        比如你建立一个普通用户test1，要想让<code>test1</code>的家目录在<code>/data</code>目录下，只要修改<code>/etc/passwd</code>文件中<code>test1</code>那行中的该字段为<code>/data</code>即可。
    </li>
    <li><strong>Shell：</strong><br />
        用户登录后要启动一个进程，用来将用户下达的指令传给内核，这就是<code>shell</code>。<code>Linux</code>的<code>shell</code>有很多种<code>sh, csh, ksh, tcsh, bash</code>等，
        而<code>Redhat/CentOS</code>的<code>shell</code>就是<code>bash</code>。查看<code>/etc/passwd</code>文件，该字段中除了<code>/bin/bash</code>外还有<code>/sbin/nologin</code>比较多，它表示不允许该账号登录。
        如果你想建立一个账号不让他登录，那么就可以把该字段改成<code>/sbin/nologin</code>，默认是<code>/bin/bash</code>。
    </li>
</ol>

<p>我们知道很多程序的运作都与权限有关，而权限与 <code>UID/GID</code> 有关！因此各程序当然需要读取
    <code>/etc/passwd</code> 来了解不同账号的权限。 因此 <code>/etc/passwd</code> 的权限需设定为 <code>-rw-r--r--</code>，
    也正是由于这样的情况，账号密码才会迁移到<code>/etc/shadow</code>档案中。
</p>

